<?php

    require_once "Message.class.php";

	/**
	 * Versi�n de cormo
	 */
    define('CORMO_VERSION', '1.0');
	
	/**
	 * Schema, se encarga de administrar el Schema de cormo, posee los metodos necesarios
	 * para lograr obetener todos los datos de la definici�n de los objetos del sistema.
	 *
     * @category cormo
     * @package Core
     * @author Germán Dario Peraferrer <gperaferrer@gmail.com>
     * @copyright Copyright (c) 2007 Germán Dario Peraferrer - Beetec
     * @version 1.0 Beta
     * @license http://www.opensource.org/licenses/bsd-license.php New BSD License
     * @link http://code.google.com/p/cormoframework/
     * @link http://www.beetec.com.ar
	 */
	
	class Schema	{
		
        /**
        * Array: que contiene la configuraci�n del objeto a manipular.
        *
        * @var Array
        */
        private $configData = array();
   
        /**
        * Composicion: Instancia de Message
        *
        * @var Message
        */
        private $Message;
   
        /**
        * Creamos el Objeto de Persistencia el cual sera utilizado para poder
        * crear los Objetos del Modelo del Negocio y administrar su Persistencia.
        *
        * @return void
        */
        public function __construct($nameObjectORM) {
            /**
             * $$ lo usamos para poder tomar lo que se paso como el valor de NameObjectORM como una variable
             * real de programa, la hacemos global, porque se trata de una variable que se encuentra en
             * Schema.php
             */
            global $CORMO;
   	 
            $this->Message = new Message();
            try  {
                @$this->setConfig($CORMO[$nameObjectORM]);
            }  catch(PDOException $e)  {
                die("Config Error: No se ha podido inicializar la Configuracion para el ORM.<br>".$e->getMessage());
            }
        }
   
        /**
        * Establecemos la configuracion del Objeto completa, es decir, podemos
        * tener el array con los datos en otro sector y pasarlo como parametro
        * para de esta manera lograr una abstraccion de la configuracion.
        *
        * @param array $config
        */
        public function setConfig($config)	{
            $this->configData = $config;
        }
   
        /**
        * Nos permite establecer las diversas configuraciones del Objeto para permitir la
        * correcta Persistencia de manera Automatica.
        *
        * @param string $clave
        * @param string $valor
        */
        public function setConfigData($clave, $valor)  {
            $this->configData[$clave] = $valor;
        }
   
        /**
        * Nos permite recuperar la configuracion que se necesite para llevar a cabo
        * una Persistencia o bien leer un dato de la Base de Datos.
        *
        * @param string $clave
        * @return string
        */
        public function getConfigData($clave)  {
            return $this->configData[$clave];
        }

        /**
        * Devuelve el la Instacia del Manejador de Mensajes para Persist
        *
        * @return Message
        */
        protected function Message()	{
            return $this->Message;
        }
   
        /**
        * Obtiene elUltimo Mensaje de Persist y se implementa para que las Class
        * que heredan de Persist puedan obtene el Ultimo Mensaje.
        *
        * @return string
        */
		public function getMessage()	{
			return $this->Message()->getMessage();
		}

		/**
		 * Busca un valor dentro de un array
		 *
		 * @param array $arr
		 * @param string $value
		 * @return boolean
		 */
		private static function existsInArray($arr, $value) {
			foreach ($arr as $dat) {
				if (strtolower($dat) == strtolower($value)) {
					return true;
				}
			}
			return false;
		}
		
		/**
		 * Verifica si los datos ingresados en el Archivo Schema.php son coherentes con respecto a su estructura
		 * y condicionales.
		 * 
		 * @param string $logValidate Usar con &$logValidate para obtener el contenido del analisis realizado.
		 * @return boolean
		 *
		 */
		public static function isValidSchema($logValidate) {
			global $CORMO;
			$return = true;
			
			$logValidate = '<h1>cormo v'.CORMO_VERSION.' - Validate Schema</h1>';
			$logValidate .= '<b>Para identificar Errores, busque el mensaje "<font color="red">ERROR</font>"</b>';
			$logValidate .= '<pre>';
			
			foreach ($CORMO as $key => $cfg) {
				// Posee un Guion Bajo la definicion ?
				if (($pos = strpos($key, '_')) > 0) {
					// Obtenemos el prefijo orm_, cnx_ wsdl_
					$prefijo = substr($key, 0, ++$pos);
					// Obtenemos el nombre del Objeto
					$nameObject = substr($key, strlen($prefijo), strlen($key));

					// Controlamos si asignaron nombre al objeto
					if (strlen($nameObject) > 0) {
						
						// Identificamos que Tipo de Objeto vamos a validar
						switch ($prefijo) {
						
							// Objetos de Conexi�n a Bases de Datos
							case 'cnx_':
									$tmpObject = $CORMO[$key];
									$logValidate .= '<hr><b>'.$key.'</b><br>';
									
									// Verificamos si Type es String
									if (is_string($tmpObject["type"])) {
										$logValidate .= '  <b>Type</b> es String: <b><font color="green">OK</font></b><br>';
										// verificamos i no esta vacio
										if (strlen($tmpObject["type"]) >0) {
											$logValidate .= '  <b>Type</b> posee valor: <b><font color="green">OK</font></b><br>';
											// Verificamos si es uno de los valores validos
											switch ($tmpObject["type"]) {
												case 'mssql':
														$logValidate .= '  <b>Type</b> correcto ('.$tmpObject["type"].'): <b><font color="green">OK</font></b><br>';
													break;
												case 'mysql':
														$logValidate .= '  <b>Type</b> correcto ('.$tmpObject["type"].'): <b><font color="green">OK</font></b><br>';
													break;
												case 'ibm':
														$logValidate .= '  <b>Type</b> correcto ('.$tmpObject["type"].'): <b><font color="green">OK</font></b><br>';
													break;
												case 'firebird':
														$logValidate .= '  <b>Type</b> correcto ('.$tmpObject["type"].'): <b><font color="green">OK</font></b><br>';
													break;
												case 'informix':
														$logValidate .= '  <b>Type</b> correcto ('.$tmpObject["type"].'): <b><font color="green">OK</font></b><br>';
													break;
												case 'oci':
														$logValidate .= '  <b>Type</b> correcto ('.$tmpObject["type"].'): <b><font color="green">OK</font></b><br>';
													break;
												case 'odbc':
														$logValidate .= '  <b>Type</b> correcto ('.$tmpObject["type"].'): <b><font color="green">OK</font></b><br>';
													break;
												case 'pgsql':
														$logValidate .= '  <b>Type</b> correcto ('.$tmpObject["type"].'): <b><font color="green">OK</font></b><br>';
													break;
												case 'sqlite':
														$logValidate .= '  <b>Type</b> correcto ('.$tmpObject["type"].'): <b><font color="green">OK</font></b><br>';
													break;
												case '4D':
														$logValidate .= '  <b>Type</b> correcto ('.$tmpObject["type"].'): <b><font color="green">OK</font></b><br>';
													break;
												default: 
														$logValidate .= '  <b>Type</b> Incorrecto ('.$tmpObject["type"].'): <b><font color="red">ERROR</font></b> Valores permitidos: mysql, mssql, pgsql, ibm, oci, odbc, sqlite, firebird, informix, 4D <br>';
														$return = false;
													break;
											}
											
										} else {
											$logValidate .= '  <b>Type</b> NO posee valor: <b><font color="red">ERROR</font></b><br>';
											$return = false;
										}
										
										
									} else {
										$logValidate .= '  <b>Type</b> NO es String: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}
									
									// Verificamos si host es String
									if (is_string($tmpObject["host"])) {
										$logValidate .= '  <b>Host</b> es String: <b><font color="green">OK</font></b><br>';
										// Verificamos si posee valor
										if (strlen($tmpObject["host"]) >0) {
											$logValidate .= '  <b>Host</b> posee valor: <b><font color="green">OK</font></b><br>';
										} else {
											$logValidate .= '  <b>Host</b> NO posee valor: <b><font color="red">ERROR</font></b><br>';
											$return = false;
										}
									} else {
										$logValidate .= '  <b>Host</b> NO es String: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}

									// Verificamos si dbname es String
									if (is_string($tmpObject["dbname"])) {
										$logValidate .= '  <b>DBName</b> es String: <b><font color="green">OK</font></b><br>';
										// Verificamos si posee valor
										if (strlen($tmpObject["dbname"]) >0) {
											$logValidate .= '  <b>DBName</b> posee valor: <b><font color="green">OK</font></b><br>';
										} else {
											$logValidate .= '  <b>DBName</b> NO posee valor: <b><font color="red">ERROR</font></b><br>';
											$return = false;
										}
									} else {
										$logValidate .= '  <b>DBName</b> NO es String: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}

									// Verificamos si user es String
									if (is_string($tmpObject["user"])) {
										$logValidate .= '  <b>User</b> es String: <b><font color="green">OK</font></b><br>';
										// Verificamos si posee valor
										if (strlen($tmpObject["user"]) >0) {
											$logValidate .= '  <b>User</b> posee valor: <b><font color="green">OK</font></b><br>';
										} else {
											$logValidate .= '  <b>User</b> NO posee valor: <b><font color="red">ERROR</font></b><br>';
											$return = false;
										}
									} else {
										$logValidate .= '  <b>User</b> NO es String: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}

									// Verificamos si password es String
									if (is_string($tmpObject["password"])) {
										$logValidate .= '  <b>Password</b> es String: <b><font color="green">OK</font></b><br>';
									} else {
										$logValidate .= '  <b>Password</b> NO es String: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}

									// Verificamos si persistent es String
									if (is_bool($tmpObject["persistent"])) {
										$logValidate .= '  <b>Persistent</b> es Boolean: <b><font color="green">OK</font></b><br>';
									} else {
										$logValidate .= '  <b>Persistent</b> NO es Boolean: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}
									
								break;
						
							// Objetos del Sistema
							case 'orm_':
									$tmpObject = $CORMO[$key];
									$logValidate .= '<hr><b>'.$key.'</b><br>';
									
									// Verificamos si todos los items estan bien tipificados
									if (is_array($tmpObject["Fields"])) {
										$logValidate .= '  <b>Fields</b> es Array: <b><font color="green">OK</font></b><br>';
										// Verificamos si Fields posee valores en el Array
										if (count($tmpObject["Fields"]) > 0) {
											$logValidate .= '  <b>Fields</b> posee valores: <b><font color="green">OK</font></b><br>';
										} else {
											$logValidate .= '  <b>Fields</b> NO posee valores: <b><font color="red">ERROR</font></b><br>';
											$return = false;
										}
									} else {
										$logValidate .= '  <b>Fields</b> NO es Array: <b><font color="red">ERROR</font></b><br>';
										$logValidate .= '  <b>Fields</b> NO posee valores: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}
										
									// Verificamos el nombre de la Tabla
									if (is_string($tmpObject["TableName"])) {
										$logValidate .= '  <b>TableName</b> es String: <b><font color="green">OK</font></b><br>';
										// Verificamos si tiene nombre
										if (strlen($tmpObject["TableName"]) > 0) {
											$logValidate .= '  <b>TableName</b> posee valor: <b><font color="green">OK</font></b><br>';
										} else {
											$logValidate .= '  <b>TableName</b> NO posee valor: <b><font color="red">ERROR</font></b><br>';
											$return = false;
										}
									} else {
										$logValidate .= '  <b>TableName</b> NO es String: <b><font color="red">ERROR</font></b><br>';
										$logValidate .= '  <b>TableName</b> NO posee valor: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}
									
									// Verificamos el Key de la Table
									if (is_string($tmpObject["Key"])) {
										$logValidate .= '  <b>Key</b> es String: <b><font color="green">OK</font></b><br>';
										// Verificamos si tiene nombre
										if (strlen($tmpObject["Key"]) > 0) {
											$logValidate .= '  <b>Key</b> posee valor: <b><font color="green">OK</font></b><br>';
										} else {
											$logValidate .= '  <b>Key</b> NO posee valor: <b><font color="red">ERROR</font></b><br>';
											$return = false;
										}
										
										// Verificamos si el campo especificado existe el Fields
										if (in_array($tmpObject["Key"], $tmpObject["Fields"])) {
											$logValidate .= '  <b>Key</b> El campo especificado existe el Fields: <b><font color="green">OK</font></b><br>';
										} else {
											$logValidate .= '  <b>Key</b> El campo especificado NO existe el Fields: <b><font color="red">ERROR</font></b><br>';
											$return = false;
										}
										
									} else {
										$logValidate .= '  <b>Key</b> NO es String: <b><font color="red">ERROR</font></b><br>';
										$logValidate .= '  <b>Key</b> NO posee valor: <b><font color="red">ERROR</font></b><br>';
										$logValidate .= '  <b>Key</b> El campo especificado NO existe el Fields: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}
									
									// Verificamos el TableAssociate
									if (is_array($tmpObject["TableAssociate"])) {
										$logValidate .= '  <b>TableAssociate</b> es Array: <b><font color="green">OK</font></b><br>';
										// Verificamos si posee alguna relaci�n
										if (count($tmpObject["TableAssociate"]) > 0) {
											$logValidate .= '  <b>TableAssociate</b> posee valores: <b><font color="green">OK</font></b><br>';
											
											// Verificamos si las relaciones estan bien definidas
											foreach($tmpObject["TableAssociate"] as $class => $associate) {
												
												// Verificamos que tipo de Associate posee
												switch ($associate) {
													
													case '1:n':
														// Verificamos si existe el Class con el cual se realciona
														if (array_key_exists('orm_'.$class, $CORMO)) {
															$logValidate .= '  <b>TableAssociate</b> 1:n existe Class ('.$class.'): <b><font color="green">OK</font></b><br>';
															// Verificamos si se ha creado el Object de relacion 1:n
															if (array_key_exists('orm_'.$tmpObject["ObjectName"].$class, $CORMO)) {
																$logValidate .= '  <b>TableAssociate</b> 1:n existe Class ('.$tmpObject["ObjectName"].$class.'): <b><font color="green">OK</font></b><br>';
																
																// Obtenemos las Definiciones de los Objetos a Asociar para verificar su correcta definicion
																$tmpObjectAssociateDestino = $CORMO['orm_'.$class];
																$tmpObjectAssociate = $CORMO['orm_'.$tmpObject["ObjectName"].$class];
																
																// Verificamos si existen los Campos id de realacion bien definidos
																if (in_array($tmpObject["Key"].$tmpObject["ObjectName"], $tmpObjectAssociate["Fields"])) {
																	$logValidate .= '  <b>TableAssociate</b> Field ('.$tmpObject["Key"].$tmpObject["ObjectName"].') de realción para ('.$tmpObject["ObjectName"].'): <b><font color="green">OK</font></b><br>';
																} else {
																	$logValidate .= '  <b>TableAssociate</b> Field ('.$tmpObject["Key"].$tmpObject["ObjectName"].') de realción para ('.$tmpObject["ObjectName"].'): <b><font color="red">ERROR</font></b><br>';
																	$return = false;
																}
																
																// Verificamos si existen los Campos id de realacion destino bien definidos
																if (in_array($tmpObjectAssociateDestino["Key"].$tmpObjectAssociateDestino["ObjectName"], $tmpObjectAssociate["Fields"])) {
																	$logValidate .= '  <b>TableAssociate</b> Field ('.$tmpObjectAssociateDestino["Key"].$tmpObjectAssociateDestino["ObjectName"].') de realción para ('.$tmpObjectAssociateDestino["ObjectName"].'): <b><font color="green">OK</font></b><br>';
																} else {
																	$logValidate .= '  <b>TableAssociate</b> Field ('.$tmpObjectAssociateDestino["Key"].$tmpObjectAssociateDestino["ObjectName"].') de realción para ('.$tmpObjectAssociateDestino["ObjectName"].'): <b><font color="red">ERROR</font></b><br>';
																	$return = false;
																}
																
																// Verificamos si se ha realizado la Relaci�n 1:1 con los class Asociados
																if (array_key_exists($tmpObject["ObjectName"], $tmpObjectAssociate["TableAssociate"])) {
																	$logValidate .= '  <b>TableAssociate</b> Association 1:1 de realción para ('.$tmpObject["ObjectName"].'): <b><font color="green">OK</font></b><br>';
																	// Verificamos si se ha relacionado con el campo correspondiente
																	if ($tmpObject["Key"].$tmpObject["ObjectName"] == $tmpObjectAssociate["TableAssociate"][$tmpObject["ObjectName"]]) {
																		$logValidate .= '  <b>TableAssociate</b> Field ('.$tmpObject["Key"].$tmpObject["ObjectName"].') Association 1:1 de realción para ('.$tmpObject["ObjectName"].'): <b><font color="green">OK</font></b><br>';
																	} else {
																		$logValidate .= '  <b>TableAssociate</b> Field ('.$tmpObject["Key"].$tmpObject["ObjectName"].') Association 1:1 de realción para ('.$tmpObject["ObjectName"].'): <b><font color="red">ERROR</font></b><br>';
																		$return = false;
																	}
																	
																	// Verificamos si se ha relacionado con el campo correspondiente
																	if ($tmpObjectAssociateDestino["Key"].$tmpObjectAssociateDestino["ObjectName"] == $tmpObjectAssociate["TableAssociate"][$tmpObjectAssociateDestino["ObjectName"]]) {
																		$logValidate .= '  <b>TableAssociate</b> Field ('.$tmpObjectAssociateDestino["Key"].$tmpObjectAssociateDestino["ObjectName"].') Association 1:1 de realción para ('.$tmpObjectAssociateDestino["ObjectName"].'): <b><font color="green">OK</font></b><br>';
																	} else {
																		$logValidate .= '  <b>TableAssociate</b> Field ('.$tmpObjectAssociateDestino["Key"].$tmpObjectAssociateDestino["ObjectName"].') Association 1:1 de realción para ('.$tmpObjectAssociateDestino["ObjectName"].'): <b><font color="red">ERROR</font></b><br>';
																		$return = false;
																	}
																	
																} else {
																	$logValidate .= '  <b>TableAssociate</b> Association 1:1 de realción para ('.$tmpObject["ObjectName"].'): <b><font color="red">ERROR</font></b><br>';
																	$return = false;
																}
																
															} else {
																$logValidate .= '  <b>TableAssociate</b> 1:n NO existe Class ('.$tmpObject["ObjectName"].$class.'): <b><font color="red">ERROR</font></b><br>';
																$return = false;
															}
															
														} else {
															$logValidate .= '  <b>TableAssociate</b> 1:n NO existe Class ('.$class.'): <b><font color="red">ERROR</font></b><br>';
															$return = false;
														}
														
														break;
														
													default: // Realacion 1:1
															// Verificamos si el Class existe definido
															if (array_key_exists('orm_'.$class, $CORMO)) {
																$logValidate .= '  <b>TableAssociate</b> 1:1 existe Class ('.$class.'): <b><font color="green">OK</font></b><br>';
																// Verificamos si el campo asociado existe en Fields
																if (in_array($associate, $tmpObject["Fields"])) {
																	$logValidate .= '  <b>TableAssociate</b> 1:1 existe Field ('.$associate.'): <b><font color="green">OK</font></b><br>';
																} else {
																	$logValidate .= '  <b>TableAssociate</b> 1:1 NO existe Field ('.$associate.'): <b><font color="red">ERROR</font></b><br>';
																	$return = false;
																}
															} else {
																$logValidate .= '  <b>TableAssociate</b> 1:1 NO existe Class ('.$class.'): <b><font color="red">ERROR</font></b><br>';
																$return = false;
															}
														break;
													
												}
												
											}
											
										} else {
											$logValidate .= '  <b>TableAssociate</b> NO posee valores: <b>Warning</b><br>';
										}
										
									} else {
										$logValidate .= '  <b>TableAssociate</b> NO es Array: <b><font color="red">ERROR</font></b><br>';
										$logValidate .= '  <b>TableAssociate</b> NO posee valores: <b>Warning</b><br>';
										$return = false;
									}
									
									// Verificamos ObjectName
									if (is_string($tmpObject["ObjectName"])) {
										$logValidate .= '  <b>ObjectName</b> es String: <b><font color="green">OK</font></b><br>';
										// Verificamos si tiene nombre
										if (strlen($tmpObject["ObjectName"]) > 0) {
											$logValidate .= '  <b>ObjectName</b> posee valor: <b><font color="green">OK</font></b><br>';
											// Verificamos si ObjectName es igual al Nombre de la definicion orm_XXXXXX
											if ($nameObject == $tmpObject["ObjectName"]) {
												$logValidate .= '  <b>ObjectName</b> igual a su nombre de definición: <b><font color="green">OK</font></b><br>';
											} else {
												$logValidate .= '  <b>ObjectName</b> NO es igual a su nombre de definición: <b><font color="red">ERROR</font></b><br>';
												$return = false;
											}

											// Controlamos que no exista ningun campo en Fields con el mismo nombre
											if (self::existsInArray($tmpObject["Fields"], $tmpObject["ObjectName"])) {
												$logValidate .= '  <b>ObjectName</b> No debe existir Field con mismo nombre de ObjectName: <b><font color="red">ERROR</font></b><br>';
												$return = false;
											} else {
												$logValidate .= '  <b>ObjectName</b> No debe existir Field con mismo nombre de ObjectName: <b><font color="green">OK</font></b><br>';
											}
											
										} else {
											$logValidate .= '  <b>ObjectName</b> NO posee valor: <b><font color="red">ERROR</font></b><br>';
											$return = false;
										}
										
									} else {
										$logValidate .= '  <b>ObjectName</b> NO es String: <b><font color="red">ERROR</font></b><br>';
										$logValidate .= '  <b>ObjectName</b> NO posee valor: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}
									
									// Verificamos si DefaultValues es Array
									if (is_array($tmpObject["DefaultValues"])) {
										$logValidate .= '  <b>DefaultValues</b> es Array: <b><font color="green">OK</font></b><br>';
										// Verificamos si posee valores
										if (count($tmpObject["DefaultValues"]) >0) {
											$logValidate .= '  <b>DefaultValues</b> posee valores: <b><font color="green">OK</font></b><br>';
											// Verificamos los campos asignados en DefaultValues
											foreach($tmpObject["DefaultValues"] as $key => $value) {
												if (in_array($key, $tmpObject["Fields"])) {
													$logValidate .= '  <b>DefaultValues</b> existe ('.$key.') en Fields: <b><font color="green">OK</font></b><br>';
												} else {
													$logValidate .= '  <b>DefaultValues</b> existe ('.$key.') en Fields: <b><font color="red">ERROR</font></b><br>';
													$return = false;
												}
											}
										} else {
											$logValidate .= '  <b>DefaultValues</b> posee valores: <b>Warning</b><br>';
										}
										
									} else {
										$logValidate .= '  <b>DefaultValues</b> NO es Array: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}

									// Verificamos si PropertyNotCompare es Array
									if (is_array($tmpObject["PropertyNotCompare"])) {
										$logValidate .= '  <b>PropertyNotCompare</b> es Array: <b><font color="green">OK</font></b><br>';
										// Verificamos si posee valores
										if (count($tmpObject["PropertyNotCompare"]) >0) {
											$logValidate .= '  <b>PropertyNotCompare</b> posee valores: <b><font color="green">OK</font></b><br>';
											// Verificamos los campos asignados en DefaultValues
											foreach($tmpObject["PropertyNotCompare"] as $key) {
												if (in_array($key, $tmpObject["Fields"])) {
													$logValidate .= '  <b>PropertyNotCompare</b> existe ('.$key.') en Fields: <b><font color="green">OK</font></b><br>';
												} else {
													$logValidate .= '  <b>PropertyNotCompare</b> existe ('.$key.') en Fields: <b><font color="red">ERROR</font></b><br>';
													$return = false;
												}
											}
										} else {
											$logValidate .= '  <b>PropertyNotCompare</b> posee valores: <b>Warning</b><br>';
										}
										
									} else {
										$logValidate .= '  <b>PropertyNotCompare</b> NO es Array: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}

									// Verificamos si Connection es Array
									if (is_string($tmpObject["Connection"])) {
										$logValidate .= '  <b>Connection</b> es String: <b><font color="green">OK</font></b><br>';
										// Verificamos si posee valores
										if (strlen($tmpObject["Connection"]) >0) {
											$logValidate .= '  <b>Connection</b> posee valores: <b><font color="green">OK</font></b><br>';
											// Verificamos si Connection existe en la definicion
											if (array_key_exists($tmpObject["Connection"], $CORMO)) {
												$logValidate .= '  <b>Connection</b> existe la Conexión: <b><font color="green">OK</font></b><br>';
											} else {
												$logValidate .= '  <b>Connection</b> NO existe la Conexión: <b><font color="red">ERROR</font></b><br>';
												$return = false;
											}
										} else {
											$logValidate .= '  <b>Connection</b> posee valores: <b><font color="red">ERROR</font></b><br>';
											$return = false;
										}
										
									} else {
										$logValidate .= '  <b>Connection</b> NO es String: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}
									
								break;
						
							// Web Services que ser�n transformados a Objeto
							case 'wsdl_':
									$tmpObject = $CORMO[$key];
									$logValidate .= '<hr><b>'.$key.'</b><br>';
								
									// Verificamos si Url es String
									if (is_string($tmpObject["Url"])) {
										$logValidate .= '  <b>Url</b> es String: <b><font color="green">OK</font></b><br>';
										// Verificamos si posee valor
										if (strlen($tmpObject["Url"]) >0) {
											$logValidate .= '  <b>Url</b> posee valor: <b><font color="green">OK</font></b><br>';
										} else {
											$logValidate .= '  <b>Url</b> NO posee valor: <b><font color="red">ERROR</font></b><br>';
											$return = false;
										}
									} else {
										$logValidate .= '  <b>Url</b> NO es String: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}

									// Verificamos si isWSDL es String
									if (is_bool($tmpObject["isWSDL"])) {
										$logValidate .= '  <b>isWSDL</b> es Boolean: <b><font color="green">OK</font></b><br>';
									} else {
										$logValidate .= '  <b>isWSDL</b> NO es Boolean: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}

									// Verificamos si ProxyHost es String
									if (is_string($tmpObject["ProxyHost"])) {
										$logValidate .= '  <b>ProxyHost</b> es String: <b><font color="green">OK</font></b><br>';
									} else {
										$logValidate .= '  <b>ProxyHost</b> NO es String: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}

									// Verificamos si ProxyPort es String
									if (is_string($tmpObject["ProxyPort"])) {
										$logValidate .= '  <b>ProxyPort</b> es String: <b><font color="green">OK</font></b><br>';
									} else {
										$logValidate .= '  <b>ProxyPort</b> NO es String: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}

									// Verificamos si ProxyUserName es String
									if (is_string($tmpObject["ProxyUserName"])) {
										$logValidate .= '  <b>ProxyUserName</b> es String: <b><font color="green">OK</font></b><br>';
									} else {
										$logValidate .= '  <b>ProxyUserName</b> NO es String: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}

									// Verificamos si ProxyPassword es String
									if (is_string($tmpObject["ProxyPassword"])) {
										$logValidate .= '  <b>ProxyPassword</b> es String: <b><font color="green">OK</font></b><br>';
									} else {
										$logValidate .= '  <b>ProxyPassword</b> NO es String: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}

									// Verificamos si TimeOut es String
									if (is_int($tmpObject["TimeOut"])) {
										$logValidate .= '  <b>TimeOut</b> es Numeric: <b><font color="green">OK</font></b><br>';
									} else {
										$logValidate .= '  <b>TimeOut</b> NO es Numeric: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}

									// Verificamos si ResponseTimeOut es String
									if (is_int($tmpObject["ResponseTimeOut"])) {
										$logValidate .= '  <b>ResponseTimeOut</b> es Numeric: <b><font color="green">OK</font></b><br>';
									} else {
										$logValidate .= '  <b>ResponseTimeOut</b> NO es Numeric: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}

									// Verificamos si ObjectName es String
									if (is_string($tmpObject["ObjectName"])) {
										$logValidate .= '  <b>ObjectName</b> es String: <b><font color="green">OK</font></b><br>';
										// Verificamos si posee valor
										if (strlen($tmpObject["ObjectName"]) >0) {
											$logValidate .= '  <b>ObjectName</b> posee valor: <b><font color="green">OK</font></b><br>';
											// Verificamos si ObjectName es igual al Nombre de la definicion orm_XXXXXX
											if ($nameObject == $tmpObject["ObjectName"]) {
												$logValidate .= '  <b>ObjectName</b> igual a su nombre de definición: <b><font color="green">OK</font></b><br>';
											} else {
												$logValidate .= '  <b>ObjectName</b> NO es igual a su nombre de definición: <b><font color="red">ERROR</font></b><br>';
												$return = false;
											}
										} else {
											$logValidate .= '  <b>ObjectName</b> NO posee valor: <b><font color="red">ERROR</font></b><br>';
											$return = false;
										}
									} else {
										$logValidate .= '  <b>ObjectName</b> NO es String: <b><font color="red">ERROR</font></b><br>';
										$return = false;
									}
									
								break;
						
							default: 
									$logValidate .= 'La definci�n de Objeto ['.$key.'] no comienza con: orm_ ó cnx_ ó wsdl_ por favor verfique el Archivo Schema.php<br><br>';
								break;
						}
						
					} else {
						$logValidate .= 'Objeto ['.$key.'] no posee Nombre.<br><br>';
					}
					
					
				} else {
					$logValidate .= 'La definci�n de Objeto ['.$key.'] no comienza con: orm_ ocnx_ o wsdl_ por favor verfique Schema.php<br><br>';
					
				}
				
			}
			
			$logValidate .= '</pre>';
			return $return;
			
		}
   
		
	}

?>